package com.example.service;

import com.example.domain.dto.pricing.ItemDiscountRuleDTO;
import com.example.domain.dto.pricing.PricingRuleDTO;
import com.example.domain.dto.pricing.ThresholdDiscountRuleDTO;
import com.example.domain.valueobject.DiscountResult;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 促销服务接口
 * 
 * <p>负责促销规则的管理和应用，包括：
 * <ul>
 *   <li>促销规则CRUD操作</li>
 *   <li>单品折扣规则管理</li>
 *   <li>满减折扣规则管理</li>
 *   <li>规则查询与筛选</li>
 *   <li>折扣计算服务</li>
 * </ul>
 * </p>
 * 
 * @author Means
 * @since 2025-10-27
 */
public interface PromotionService {
    
    // ========== 单品折扣规则管理 ==========
    
    /**
     * 创建单品折扣规则
     * 
     * @param name 规则名称
     * @param productId 商品ID
     * @param discountRate 折扣率（如0.8表示8折）
     * @param priority 优先级
     * @param validFrom 生效开始时间
     * @param validTo 生效结束时间
     * @return 单品折扣规则DTO
     */
    ItemDiscountRuleDTO createItemDiscount(String name, String productId, 
                                          BigDecimal discountRate, Integer priority,
                                          LocalDateTime validFrom, LocalDateTime validTo);
    
    /**
     * 更新单品折扣率
     * 
     * @param ruleId 规则ID
     * @param itemDiscountId 单品折扣ID
     * @param discountRate 新的折扣率
     * @return 更新后的单品折扣规则DTO
     */
    ItemDiscountRuleDTO updateItemDiscountRate(String ruleId, String itemDiscountId, BigDecimal discountRate);
    
    /**
     * 删除单品折扣规则（软删除）
     * 
     * @param ruleId 规则ID
     */
    void deleteItemDiscount(String ruleId);
    
    /**
     * 查询商品的折扣规则
     * 
     * @param productId 商品ID
     * @return 单品折扣规则列表
     */
    List<ItemDiscountRuleDTO> getItemDiscountsByProduct(String productId);
    
    /**
     * 查询所有单品折扣规则
     * 
     * @return 单品折扣规则列表
     */
    List<ItemDiscountRuleDTO> getAllItemDiscounts();
    
    /**
     * 获取商品当前有效的最优折扣率
     * 
     * @param productId 商品ID
     * @return 最优折扣率，如果没有折扣返回null
     */
    BigDecimal getBestDiscountRateForProduct(String productId);
    
    // ========== 满减折扣规则管理 ==========
    
    /**
     * 创建满减折扣规则
     * 
     * @param name 规则名称
     * @param thresholdAmount 门槛金额
     * @param discountAmount 减免金额
     * @param stackable 是否可叠加
     * @param thresholdUseOriginalPrice 满减门槛是否使用原价判断
     * @param priority 优先级
     * @param validFrom 生效开始时间
     * @param validTo 生效结束时间
     * @return 满减折扣规则DTO
     */
    ThresholdDiscountRuleDTO createThresholdDiscount(String name, BigDecimal thresholdAmount,
                                                     BigDecimal discountAmount, Boolean stackable,
                                                     Boolean thresholdUseOriginalPrice,
                                                     Integer priority, LocalDateTime validFrom, 
                                                     LocalDateTime validTo);
    
    /**
     * 更新满减折扣金额
     * 
     * @param ruleId 规则ID
     * @param thresholdDiscountId 满减折扣ID
     * @param thresholdAmount 新的门槛金额
     * @param discountAmount 新的减免金额
     * @return 更新后的满减折扣规则DTO
     */
    ThresholdDiscountRuleDTO updateThresholdDiscount(String ruleId, String thresholdDiscountId,
                                                     BigDecimal thresholdAmount, BigDecimal discountAmount);
    
    /**
     * 删除满减折扣规则（软删除）
     * 
     * @param ruleId 规则ID
     */
    void deleteThresholdDiscount(String ruleId);
    
    /**
     * 查询所有满减折扣规则（包括未启用的，用于管理后台）
     * 
     * @return 满减折扣规则列表
     */
    List<ThresholdDiscountRuleDTO> getAllThresholdDiscounts();
    
    /**
     * 查询当前生效的满减折扣规则（启用且在有效期内，用于前台展示）
     * 
     * @return 满减折扣规则列表
     */
    List<ThresholdDiscountRuleDTO> getEffectiveThresholdDiscounts();
    
    // ========== 促销规则通用管理 ==========
    
    /**
     * 启用促销规则
     * 
     * @param ruleId 规则ID
     */
    void enableRule(String ruleId);
    
    /**
     * 禁用促销规则
     * 
     * @param ruleId 规则ID
     */
    void disableRule(String ruleId);
    
    /**
     * 根据ID查询促销规则
     * 
     * @param ruleId 规则ID
     * @return 促销规则DTO
     */
    PricingRuleDTO getRuleById(String ruleId);
    
    /**
     * 查询所有促销规则
     * 
     * @return 促销规则列表
     */
    List<PricingRuleDTO> getAllRules();
    
    /**
     * 查询当前生效的所有促销规则
     * 
     * @return 促销规则列表（按优先级排序）
     */
    List<PricingRuleDTO> getCurrentEffectiveRules();
    
    // ========== 折扣计算服务（供PricingService调用）==========
    
    /**
     * 计算商品的单品折扣结果
     * 
     * @param productId 商品ID
     * @param originalAmount 原价金额
     * @return 折扣计算结果，包含折后金额、折扣描述、规则信息等
     */
    DiscountResult calculateItemDiscount(String productId, BigDecimal originalAmount);
    
    /**
     * 计算满减折扣结果
     * 
     * @param currentSubtotal 当前小计金额（Priority 1 折后价）
     * @param originalSubtotal 原价小计金额
     * @return 折扣计算结果，包含减免金额、满减描述、规则信息等
     */
    DiscountResult calculateThresholdDiscount(BigDecimal currentSubtotal, BigDecimal originalSubtotal);
    
    /**
     * 检查规则是否有效
     * 
     * @param ruleId 规则ID
     * @param currentTime 当前时间
     * @return 是否有效
     */
    boolean isRuleEffective(String ruleId, LocalDateTime currentTime);
}

